home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / math / math.arc / EXP.C < prev    next >
Text File  |  1988-07-21  |  2KB  |  57 lines

  1.  
  2. /***************************************************
  3.  *        Exponential Routine                      *
  4.  *                                                 *
  5.  *        IBM PC "C" Language Board                *
  6.  *        Tulsa, OK 1918-664-8737                  *
  7.  *        SYSOP Lynn Long                          *
  8.  ***************************************************/
  9.  
  10.  
  11. #include "math.h"
  12. #include "errno.h"
  13.  
  14. #define P0 0.249999999999999993e+0
  15. #define P1 0.694360001511792852e-2
  16. #define P2 0.165203300268279130e-4
  17. #define Q0 0.500000000000000000e+0
  18. #define Q1 0.555538666969001188e-1
  19. #define Q2 0.495862884905441294e-3
  20.  
  21. #define P(z) ((P2*z + P1)*z + P0)
  22. #define Q(z) ((Q2*z + Q1)*z + Q0)
  23.  
  24. #define EPS     2.710505e-20
  25.  
  26. double
  27. exp(x)
  28. double x;
  29. {
  30.         int n;
  31.         double xn, g, r, z;
  32.         extern int errno;
  33.  
  34.         if (x > LOGHUGE) {
  35.                 errno = ERANGE;
  36.                 return HUGE;
  37.         }
  38.         if (x < LOGTINY) {
  39.                 errno = ERANGE;
  40.                 return 0.0;
  41.         }
  42.         if (fabs(x) < EPS)
  43.                 return 1.0;
  44.         n = z = x * 1.4426950408889634074;
  45.         if (n < 0)
  46.                 --n;
  47.         if (z-n >= 0.5)
  48.                 ++n;
  49.         xn = n;
  50.         g = ((x - xn*0.693359375)) + xn*2.1219444005469058277e-4;
  51.         z = g*g;
  52.         r = P(z)*g;
  53.         r = 0.5 + r/(Q(z)-r);
  54.         return ldexp(r,n+1);
  55. }
  56.  
  57.